package com.kuang.utils;

import com.kuang.pojo.Commodity;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * @description: HTML代码解析工具类
 * @author: wuhaohua
 * @date: Created in 2022/4/10 16:16
 * @version: 1.0
 */
@Component
public class HtmlParseUtil {

//    public static void main(String[] args) throws IOException {
//        // 测试工具类
//        new HtmlParseUtil().parseJD("心理学").forEach(System.out::println);
//    }
    /**
     * 在京东搜索关键字并解析其结果
     *
     * @param keyword 搜索的关键字
     * @return {@link List< Commodity>} 返回一个对象列表
     * @throws IOException 解析HTML代码时可能会抛出该异常
     * @author: wuhaohua
     * @date: 2022/4/10
     * @description:
     **/
    public List<Commodity> parseJD(String keyword) throws IOException {
        // 获取请求：https://search.jd.com/Search?keyword=java
        // 注意：使用jsoup无法获取ajax请求，如果想获取ajax请求返回的数据，需要单独用java代码模拟ajax请求
        String url = "https://search.jd.com/Search?keyword=" + keyword.trim();
        // 解析网页（Jsoup返回的Document对象就是浏览器中的Document对象），并设置超时时间为10秒
        Document parse = Jsoup.parse(new URL(url), 10000);
        // 所有在js代码中可以使用的方法，这里也同样可以使用
        // 分析京东网站的代码，获取存放搜索结果的div元素
        Element element = parse.getElementById("J_goodsList");
        // 打印获取的源码
//        System.out.println(element.html());

        // 暂存解析出来的数据
        List<Commodity> result = new ArrayList<>();

        // 获取每一个搜索结果的列表元素
        Elements elements = element.getElementsByTag("li");
        // 获取元素的内容，这里的el就是每一个标签了
        for (Element el : elements) {
            // 获取我们需要的数据
            try {
                // 使用下面的这种方法，是无法获取到图片的url的，因为图片是懒加载的方式加载的，当页面刚请求回来时，该图片还没有被加载
//            String img_url = el.getElementsByTag("img").eq(0).attr("src");`
                // 通过分析源码，可以得知在懒加载完成前，图片的url存放在data-lazy-img属性里
                String img_url = el.getElementsByTag("img").eq(0).attr("data-lazy-img");
                String price_str = el.getElementsByClass("p-price").get(0).getElementsByTag("i").eq(0).text();
                String id = el.attr("data-sku");
                String title = el.getElementsByClass("p-name").eq(0).text();
//            System.out.println("标题：" + title + "，价格：" + price_str + "，图片：" + img_url);
                // 将解析的参数放入对象
                Commodity commodity = new Commodity();
                commodity.setId(id);
                commodity.setImg_url(img_url);
                commodity.setPrice_str(price_str);
                commodity.setTitle(title);
                result.add(commodity);
            }catch (Exception ex) {
                ex.printStackTrace();
            }
        }

        return result;
    }
}
